package pl.cezary.butler.walili.server;

import pl.cezary.butler.walili.server.db.Database;
import pl.cezary.butler.walili.server.db.utils.StorageBD;
import pl.cezary.butler.walili.server.db.tasks.UpdateTaskTask;
import java.util.Date;
import java.util.concurrent.BlockingQueue;


// <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
// #[regen=yes,id=DCE.DC9746EE-635C-C2F5-8508-219739A3C06E]
// </editor-fold> 
public class TaskDoneRegisteringThread extends Thread {

    private final Queues kolejki;
    private TaskSet zadania;
    private Database baza = null;
     
   
    public TaskDoneRegisteringThread(Queues k) {
        super(TaskDoneRegisteringThread.class.getSimpleName());
        kolejki = k;
        zadania = kolejki.getTaskStorage();        
    }

    private void setBazaDanych(){
        if(baza==null){
            baza = StorageBD.getBD(Server.MAIN_DB);
        }
    }
    
    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.51F9BAA1-6CF7-589B-4882-D0ECF8CD32C7]
    // </editor-fold> 
    @Override
    public void run() {
        setBazaDanych();
        BlockingQueue<UserTask> rejestracja = kolejki.getDoneTaskToRegisterQueue();
        try {
            while (!interrupted()) {
                zarejestrujWykonanieZadanie(rejestracja.take());
            }
        } catch (InterruptedException e) {
            return;
        }
    }

    /**
     * rejestruje wykonanie zadania przez uzytkownika, 
     * zapisuje nowy status w bazie danych
     * usuwa informacje o pobraniu zadania 
     * @param pair
     */
    private void zarejestrujWykonanieZadanie(UserTask pair) {
        ServerTask zad = pair.getZadanie();
        zad.setOstatniPrzetwarzajacy(pair.getUser());
        zad.setDataPrzetwarzania(new Date());               
        baza.executeDbTask(new UpdateTaskTask(zad));
        zadania.remove(zad);
    }
}

